/*
 * EleccionParser.cpp
 *
 *  Created on: Oct 9, 2011
 *      Author: Belen
 */

#include "EleccionParser.h"

EleccionParser::EleccionParser() {
	
}

EleccionParser::~EleccionParser() {
}

vector<Eleccion> EleccionParser::parse(string filePath, unsigned long* registrosOK, unsigned long* registrosFAIL) {
	vector<Eleccion> eleccionesParseadas;

	(*registrosFAIL) = 0;
	(*registrosOK) = 0;

	fstream _file;
	_file.open(filePath.c_str(),ios::out | ios::in);

	/* 
	 * cada linea tiene el formato:
	 * AAAAMMDD|cargo|distrito1,distrito2,...
	 * AAAAMMDD|cargo|distrito1,distrito2,...
	 * 
	 */
	if (!_file.is_open()) {

	}
	else {
		string aLine; 
		while (getline(_file, aLine)) {
			unsigned long fecha = -1;
			unsigned long cargo = -1;
			vector<string> distrito;
			unsigned long dist = -1;			
			
			// limpio "aLine
			StringUtils su;
			aLine = su.replaceAllOccurences(aLine,"\r"," ");
			aLine = su.replaceAllOccurences(aLine,"\n"," ");
			su.trim(aLine);

			if (aLine.length() == 0) {
				continue;
			}


			size_t separatorI = aLine.find_first_of('|', 0);
			
			if (separatorI == string::npos) {
				//no hay separador
				(*registrosFAIL)++;
				continue;
			}
			
			string dato = aLine.substr(0,separatorI);
			fecha = strtoul(dato.c_str(),NULL,0);
			
			size_t separatorF = aLine.find_first_of('|',separatorI+1);
			dato = aLine.substr(separatorI+1,separatorF-separatorI-1);
			cargo = strtoul(dato.c_str(),NULL,0);
			
			if (separatorF == string::npos) {
				(*registrosFAIL)++;
				continue;
			}
			
			string distritoS = aLine.substr(separatorF+1);

			distrito = su.split(distritoS,',');
		
			// tanto las fechas como cargos son mayores a 0, sino es un error
			if (fecha <= 0 || cargo<=0) {
				(*registrosFAIL)++;
				continue;
			}
			// Crea el objeto Eleccion
			Eleccion eleccion;
			
			eleccion.setFecha(fecha);
			eleccion.setCargoPrincipalId(cargo);
			
			for(int i=0; i< distrito.size();i++){
				dist = strtoul(distrito.at(i).c_str(),NULL,0);
				eleccion.addDistrito(dist);
			}			
			
			eleccionesParseadas.push_back(eleccion);			
			(*registrosOK)++;
		}
	}
	return eleccionesParseadas;
}
